package com.krystal.crawler;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.krystal.bean.CovidBean;
import com.krystal.util.HttpUtils;
import com.krystal.util.TimeUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.testng.annotations.Test;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Krystal1
 * @date 2021/4/25 -14:25
 * 实现疫情数据爬取  测试类 （非主要程序代码）
 */

public class Covid19DateCrawler {


    @Test
    public void testCrawling() throws Exception {
        String datetime = TimeUtils.format(System.currentTimeMillis(), "yyyy-MM-dd");

        //1.爬取指定页面
        String html = HttpUtils.getHtml("https://ncov.dxy.cn/ncovh5/view/pneumonia");
        //System.out.println(html);

        //2.解析页面中的指定内容,即id为getAreaStat的标签中的全国疫情数据
        Document doc = Jsoup.parse(html);
        String text = doc.select("script[id=getAreaStat]").toString();
        System.out.println(text);

        //3.使用正则表达式获取json格式的疫情数据
        String pattern = "\\[(.*)\\]";              //定义正则规则
        Pattern reg = Pattern.compile(pattern);     //编译成正则对象
        Matcher matcher = reg.matcher(text);        //去text中进行匹配
        String jsonStr = "";
        if (matcher.find()) {                         //如果text中的内容和正则规则匹配上就取出来赋值给jsonStr变量
            jsonStr = matcher.group(0);
            //System.out.println(jsonStr);
        } else {
            System.out.println("no match");
        }

        //4.对json数据进行更进一步的解析
        //将第一层Json（省份数据）解析为JavaBean
        List<CovidBean> pCovidBeans = JSON.parseArray(jsonStr, CovidBean.class);         //省份的
        for (CovidBean pCovidBean : pCovidBeans) {          //pCovidBean 为省份
            //System.out.println(pCovidBean);
            //先设置时间字段
            pCovidBean.setDatetime(datetime);
            //这里可以将省的数据放入数据库了

            //System.out.println(pCovidBean);
            //获取cities
            String citysStr = pCovidBean.getCities();

            //5.将第二层json(城市数据)解析为JavaBean
            List<CovidBean> covidBeans = JSON.parseArray(citysStr, CovidBean.class);
            for (CovidBean bean : covidBeans) {                     //bean为城市
                //System.out.println(bean);
                bean.setDatetime(datetime);
                bean.setPid(pCovidBean.getLocationId());    //把省份的id作为城市的pid
                bean.setProvinceShortName(pCovidBean.getProvinceShortName());
                //System.out.println(bean);
                //后续需要将城市疫情数据发送给Kafka
                //将JavaBean转为jsonStr再发送给Kafka
            }
            //6.获取第一层json（省份数据）中的每一天的统计数据
            String statisticsDataUrl = pCovidBean.getStatisticsData();
            String statisticsDataStr = HttpUtils.getHtml(statisticsDataUrl);
            //获取statisticDataStr中的data字段对应的数据
            JSONObject jsonObject = JSON.parseObject(statisticsDataStr);
            String dataStr = jsonObject.getString("data");
            //System.out.println(dataStr);
            //将爬取解析出来的每一天的数据设置回省份pCovidBean中的statisticsData字段中（之前该字段只是一个URL）
            pCovidBean.setStatisticsData(dataStr);
            pCovidBean.setCities(null);
            //System.out.println(pCovidBean);
            //后续需要将省份疫情数据发送给Kafka

        }

    }
}
